import java.util.Arrays;

public class MyArrayList implements IList {
    public int[] elem;
    public int usedSize;
    //默认的容量
    public static final int DEFAULT_CAPACITY = 5;
    public MyArrayList() {
        elem = new int[DEFAULT_CAPACITY];
    }

    //添加元素,默认添加到数组的最后位置
    @Override
    public void add(int data) {
        //1.判断数组是否满了,满了要扩容
        if(isFull()) {
            elem = Arrays.copyOf(elem,2*elem.length);
        }
        elem[usedSize] = data;
        usedSize++;
    }

    /**
     * 给pos位置 添加一个元素(即指定位置插入元素)
     * @param pos
     * @param data
     */
    @Override
    public void add(int pos, int data) {
        //1.pos位置的判断
        checkPosOfAdd(pos);
        if(isFull()) {
            elem = Arrays.copyOf(elem,2*elem.length);
        }
        /**
         *   1.elem的下标i是 最后 一个存储的数据元素的位置,所以是usedSize-1 (移动元素,从后往前移动)
         *   2.i下标的元素赋值给i+1下标的元素
         *   3.i-- 往前挪一个
         *   4.当 i < pos 时结束
         *   5.将要添加的元素data 放到elem的pos位置 (元素放进去)
         *   6.usedSize++
         */

        for (int i = usedSize - 1; i >= pos; i--) {
            elem[i+1] = elem[i];
        }//(移动元素,从后往前移动)
        elem[pos] = data;//(元素放进去)
        usedSize++;

    }

    public void checkPosOfAdd(int pos) {
        if(pos <0 || pos > usedSize) {
            throw new PosException("pos位置为:" + pos);
        }
    }

    //查找当前元素 是否存在
    @Override
    public boolean contains(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind) {
                return true;
            }
        }
        return false;
    }

    //查找当前元素的下标
    @Override
    public int indexOf(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind) {
                return i;
            }
        }
        return -1;
    }


    //获取pos位置的值
    @Override
    public int get(int pos) {
        //1.pos位置不合法怎么办
        checkPosOfGet(pos);
        //2.为空怎么办
        if(isEmpty()) {
            throw new EmptyException("顺序表为空");
        }
        return elem[pos];
    }

    public void checkPosOfGet(int pos) {
        if(pos < 0 || pos >= this.usedSize) {
            throw new PosException("pos位置不合法" + pos);
        }
    }

    @Override
    public boolean isEmpty() {
        return usedSize == 0;
    }

    /**
     * 更新pos位置的值为value
     * @param pos
     * @param value
     */
    @Override
    public void set(int pos, int value) {
        checkPosOfGet(pos);
        if (isEmpty()) {
            throw new EmptyException("顺序表为空");
        }
        this.elem[pos] =value;
    }

    /**
     * 删除toRemove这个数字
     * @param toRemove
     */
    @Override
    public void remove(int toRemove) {
        if(isEmpty()) {
            throw new PosException("顺序表为空,不能删除");
        }
        int index = indexOf(toRemove);
        for (int i = index; i <usedSize-1 ; i++) {
            elem[i] = elem[i+1];
        }
        usedSize--;
    }

    @Override
    public int size() {
        return this.usedSize;
    }


    //清空顺序表 防止内存泄漏
    @Override
    public void clear() {
        usedSize = 0;
    }

    //打印顺序表当中的所有元素
    @Override
    public void display() {
        for (int i = 0; i < usedSize; i++) {
            System.out.print(elem[i] +" ");
        }
        System.out.println();
    }

    @Override
    public boolean isFull() {
        return usedSize == elem.length;
    }


}
